부서별 사원 조회
✒️ 2025-05-26 11:14 내용 수정
실습 목표
- Oracle 데이터베이스에 있는 Sawon 테이블에서 사원들의 정보를 조회한다.
- 부서별 번호를 선택하면 해당 부서의 사원들 정보를 조회할 수 있도록 만든다.
실습 흐름
- 데이터베이스에 테이블 및 시퀀스, 필요 시 샘플 데이터 추가
- 데이터베이스에 연결 : context.xml 파일, 라이브러리(JDBC), Mybatis 라이브러리와 SqlMapConfig.xml 파일과 mapper.xml 파일
- 테이블의 정보를 저장할 DTO 클래스 생성
- 데이터베이스에서 조회를 수행하고 정보를 저장하는 DAO 클래스 생성
- 조회 결과를 확인할 JSP 생성
- DAO 클래스 객체를 생성하고, JSP와 연결할 Servlet 생성
- Servlet에서 코드 실행 시 결과 확인
- DB 테이블 추가 코드를 잊어버림
DB 연결
- context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
auth="Container"
name="jdbc/oracle_test"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="계정명" password="비밀번호"
maxActive="20" maxIdle="10" maxWait="1"/>
</Context>
- 라이브러리
- 라이브러리에 lomboc 추가하여 사용
| 파일 |
|---|
| commons-collections-3.2.1.jar |
| commons-dbcp-1.2.2.jar |
| commons-pool-1.4.jar |
| ojdbc8-23.3.0.23.09.jar |
| lomboc.jar |
| mybatis-3.1.1.jar |
- MybatisConnector 클래스
package service;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisConnector {
static MybatisConnector single = null;
SqlSessionFactory factory = null;
public static MybatisConnector getInstance() {
if (single == null)
single = new MybatisConnector();
return single;
}
public MybatisConnector() {
try {
Reader reader = Resources.getResourceAsReader("config/mybatis/sqlMapConfig.xml");
factory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (Exception e) {
}
}
// sqlMapConfig.xml의 정보를 담고 있는 factory객체를 반환
public SqlSessionFactory getSqlSessionFactory() {
return factory;
}
}
- SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="">
<environment id="">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source"
value="java:comp/env/jdbc/oracle_test" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="config/mybatis/mapper/sawon.xml" />
</mappers>
</configuration>
- sawon.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sawon">
<select id="sawon_list" resultType="dto.SawonDTO">
SELECT * FROM SAWON
</select>
<select id="sawon_list_no" parameterType="int" resultType="dto.SawonDTO">
SELECT * FROM SAWON WHERE DEPTNO = #{DEPTNO}
</select>
</mapper>
DTO와 DAO
- dto
package dto;
import lombok.Data;
@Data
public class SawonDTO {
private int sabun, sapay, deptno;
private String saname, sajob, sahire;
}
- dao
package dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import dto.SawonDTO;
import service.MybatisConnector;
public class SawonDAO {
SqlSessionFactory factory = null;
static SawonDAO single = null;
public static SawonDAO getInstance() {
//생성되지 않았으면 생성
if (single == null)
single = new SawonDAO();
//생성된 객체정보를 반환
return single;
}
public SawonDAO() {
factory = MybatisConnector.getInstance().getSqlSessionFactory();
}
// 모든 사원 목록 조회
public List<SawonDTO> select() {
SqlSession sqlSession = factory.openSession();
List<SawonDTO> list = sqlSession.selectList("sawon.sawon_list");
sqlSession.close();
return list;
}
// 부서별 사원 목록 조회
public List<SawonDTO> select(int deptno) {
SqlSession sqlSession = factory.openSession();
// sqlSession이 관리하는 CRUD 관련 메소드는 파라미터를 단 1개 추가할 수 있다.
List<SawonDTO> list = sqlSession.selectList("sawon.sawon_list_no", deptno);
sqlSession.close();
return list;
}
}
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function find() {
// select 태그의 value값
var deptno = document.getElementById("deptno").value;
// form 태그를 사용하지 않기에 location.href를 통해 전송
location.href = "sawon_list?deptno="+deptno;
}
// window.onload : html이 모두 로드된 후에 작동하는 callback 함수
// select 태그 옵션들 중에서 특정 번호를 선택하고 검색 버튼을 누르면 해당 번호를 선택한 상태를 유지하도록 설정
window.onload = function() {
var deptno = document.getElementById("deptno");
var dept_array = [0, 10, 20, 30, 40];
for (var i = 0; i < dept_array.length; i++) {
if ('${param.deptno}' == dept_array[i]) {
deptno[i].selected = true;
break;
}
}
}
</script>
</head>
<body>
<div align="center">
부서번호 :
<select id="deptno">
<option value="0">:::부서를 선택하세요:::</option>
<option value="10">총무부</option>
<option value="20">영업부</option>
<option value="30">전산부</option>
<option value="40">관리부</option>
<option value="50">경리부</option>
</select>
<input type="button" value="검색" onclick="find();">
</div>
<table border="1" align="center">
<caption>::사원목록::</caption>
<tr>
<th>사번</th>
<th>이름</th>
<th>직책</th>
<th>부서</th>
<th>급여</th>
<th>입사일</th>
</tr>
<c:forEach var="dto" items="${list}">
<tr>
<td>${dto.sabun}</td>
<td>${dto.saname}</td>
<td>${dto.sajob}</td>
<td>${dto.deptno}</td>
<td>${dto.sapay}</td>
<c:set var="sahire" value="${dto.sahire}"/>
<td>${fn:split(sahire,' ')[0]}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Servlet
package action;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.SawonDAO;
import dto.SawonDTO;
@WebServlet("/sawon_list")
public class SawonListAction extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// sawon_list?deptno=X
int deptno = 0;
String str_deptno = request.getParameter("deptno"); // null이 들어올 수 있어서 String으로 받음
System.out.println(str_deptno);
// 전송받은 값이 null이 아니고 비어있지 않을 때만 정보를 전송
if (str_deptno != null && !str_deptno.isEmpty()) {
deptno = Integer.parseInt(str_deptno);
}
List<SawonDTO> list = null;
if (deptno == 0) {
list = SawonDAO.getInstance().select();
} else {
list = SawonDAO.getInstance().select(deptno);
}
request.setAttribute("list", list);
RequestDispatcher disp = request.getRequestDispatcher("sawon_list.jsp");
disp.forward(request, response);
}
}